﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.Common;
using System.Data.OleDb;
using System.Data;
using Itau.SC.EnterpriseLib.Data;
using itau.im.entidade;
using NK_Atualiza_Duration.Util;
using Itau.ST.Log;

namespace NK_Atualiza_Duration.DAO
{
    internal class DB : IDisposable
    {
        #region Atributos
        private static string gbPrefixo;
        private static string gbDataSource;
        private static string strAmbiente;
        private static Database _dbDB2;       
        private static string _spConsulta; 
        private static DbCommand _cmd_SC_DB2;
        private static Ambiente _ambienteAcesso;
        #endregion

        #region Enum Ambiente
        public enum Ambiente { 
                produção,
                homologação,
                desenvolvimento        
        }
        #endregion

        #region Propriedades

        /// <summary>
        /// ambienteAcesso ( DB2 )
        /// </summary>
        /// 
        public static Ambiente ambienteAcesso
        {
            set { _ambienteAcesso = value; }
            get { return _ambienteAcesso; }
        }
        /// <summary>
        /// Database ( DB2 )
        /// </summary>
        /// 
        private static Database DbDB2
        {
            set { _dbDB2 = value; }
            get { return _dbDB2; }
        }

        private static DbConnection conexao;
        private static DbTransaction transaction;
         

        /// <summary>
        /// string PgbPrefixo ( DB2 )
        /// </summary>
        private static string PgbPrefixo
        {
            set { gbPrefixo = value; }
            get { return gbPrefixo; }
        }
        /// <summary>
        /// string PgbDataSource ( DB2 )
        /// </summary>
        private static string PgbDataSource
        {
            set { gbDataSource = value; }
            get { return gbDataSource; }
        }
        /// <summary>
        /// string pStrAmbiente
        /// </summary>
        private static string pStrAmbiente
        {
            set { strAmbiente = value; }
            get { return strAmbiente; }
        }
    
        /// <summary>
        /// Procedure ou Sql para consulta.
        /// </summary>
        private static string SpConsulta
        {
            get
            {
                return _spConsulta;
            }
            set
            {
                _spConsulta = value;
            }
        }

        #endregion

        #region Construtor
        /// <summary>
        /// Construtor da Classe.
        /// </summary>
        public DB( )
        {

            string sAmbiente = Config.RetornarValorAppSettings("AmbienteDB2"); 

            switch (sAmbiente) 
            {
                case "0":
                    { _ambienteAcesso = Ambiente.desenvolvimento; }
                    break;
                case "1":
                    { _ambienteAcesso = Ambiente.produção; }
                    break;
                default:
                    { _ambienteAcesso = Ambiente.desenvolvimento; }
                    break;
            }
            
        }
        #endregion

        #region Métodos
      
        #region Conexão

        /// <summary>
        /// Conexao DB2
        /// </summary>
        public static string ConexaoDB2
        {
            get
            {
                switch (_ambienteAcesso)
                {
                    case Ambiente.produção:
                        { return "PRODUCAO_DB2"; }
                       

                    case Ambiente.homologação:
                        { return "DESENVOLVIMENTO_DB2"; }
                        

                    default:
                        { return "DESENVOLVIMENTO_DB2"; }
                }
            }
        }

        public static bool ConectaDb2()
        {

            //Iniciando tentativa de conexÆo com o DB2.

            bool retorno = false;

            try
            {

                string MsgInfo = string.Empty;

                if (_dbDB2 == null)
                {

                    Util.Log.GravarLog("I", "Tentando Criar ConexÆo com DB2");

                    switch (_ambienteAcesso)
                    {

                        case Ambiente.produção:
                            {

                                try
                                {

                                    PgbPrefixo = "DB2GPP.";

                                    PgbDataSource = "DB2PRO";

                                    _dbDB2 = DatabaseFactory.CreateDatabase("PRODUCAO_DB2");

                                    _cmd_SC_DB2 = DbDB2.DbProviderFactory.CreateCommand();

                                    MsgInfo = "Produção";

                                    retorno = true;


                                }

                                catch (Exception ex)
                                {

                                    Util.Log.GravarLog("E", "Erro para criar a conexão com a Produção. Erro: " + ex.Message);

                                    retorno = false;

                                }

                            }

                            break;

                        case Ambiente.homologação:
                            {

                                try
                                {

                                    PgbPrefixo = "DB2CAS.";

                                    PgbDataSource = "DB2DES";

                                    _dbDB2 = DatabaseFactory.CreateDatabase("DESENVOLVIMENTO_DB2");

                                    _cmd_SC_DB2 = DbDB2.DbProviderFactory.CreateCommand();


                                    MsgInfo = "Homologação";

                                    retorno = true;

                                }

                                catch (Exception ex)
                                {

                                    Util.Log.GravarLog("E", "Erro para criar a conexão com a Homologação. Erro: " + ex.Message);

                                    retorno = false;

                                }

                            }

                            break;

                        default:
                            {

                                try
                                {

                                    PgbPrefixo = "DB2CAS.";

                                    PgbDataSource = "DB2DES";

                                    _dbDB2 = DatabaseFactory.CreateDatabase("DESENVOLVIMENTO_DB2");

                                    _cmd_SC_DB2 = DbDB2.DbProviderFactory.CreateCommand();

                                    MsgInfo = "Desenvolvimento";

                                    retorno = true;

                                }

                                catch (Exception ex)
                                {

                                    Util.Log.GravarLog("E", "Erro para criar a conexão com o Desenvolvimento. Erro: " + ex.Message);

                                    retorno = false;

                                }

                            }

                            break;

                    }

                    if (retorno)
                    {

                        try
                        {

                            conexao = _dbDB2.CreateConnection();

                            conexao.Open();

                            conexao.Close();

                            Util.Log.GravarLog("I", "Conexão com " + MsgInfo + " realiado com sucesso.");

                            retorno = true;

                        }

                        catch (Exception ex)
                        {

                            Util.Log.GravarLog("E", "Erro para se conectar a " + MsgInfo + ". Erro : " + ex.Message);

                            Util.Log.finalizaLog(ClsBatch.enum_TipoFimLogBatch.tipoFimLog_erro);

                            System.Environment.Exit(-1);

                        }

                    }

                    else
                    {

                        Util.Log.finalizaLog(ClsBatch.enum_TipoFimLogBatch.tipoFimLog_erro);

                        System.Environment.Exit(-1);

                    }

                }

                else
                {

                    retorno = true;

                }

            }

            catch (Exception ex)
            {

                Util.Log.GravarLog("E", "Erro nÆo identificado. Erro: " + ex.Message);

                Util.Log.finalizaLog(Itau.ST.Log.ClsBatch.enum_TipoFimLogBatch.tipoFimLog_erro);

                System.Environment.Exit(-1);

            }

            return retorno;

        }    
      

        #endregion

        #region Parte para calcular duration


        public IList<RegistroExecucaoCurva> ObterRegistrosExecucaoCurvaPorCurvaVigente(int curvaVigenteID)
        {
            List<RegistroExecucaoCurva> listaRetorno = new List<RegistroExecucaoCurva>();
            DataSet ds;

            try
            {
                _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IM0SZD");             
                _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                _cmd_SC_DB2.Parameters.Clear();
                _dbDB2.AddInParameter(_cmd_SC_DB2, "WCOD_CURV", DbType.Int32, curvaVigenteID);

                ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2);                

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        listaRetorno.Add(EntidadeFactory.getRegistroExecucaoCurvaIMSER(linha));
                    }
                }               
                
                return listaRetorno;
            }
            catch (Exception ex)
            {
                Util.Log.GravarLog("E", "Erro para buscar as curvas PMT's proc.IMS93 . Erro : " + ex.Message); 
            }
           
            finally
            {
                listaRetorno = null;               
            }

            return new List<RegistroExecucaoCurva>();
        }

        public IList<CurvaExecucaoPonto> buscaProjecaoCurva(int intCodigoCurva, DateTime dtDateInclusaoCurva, DateTime dtHoraExcucao) 
        {
            //List<Entity.PontoCurva> listRetorno = new List<Entity.PontoCurva>();
            List<CurvaExecucaoPonto> listaRetorno = new List<CurvaExecucaoPonto>();

            DataSet DsRetorno;
            try
            {
                _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMS45");
                _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                _cmd_SC_DB2.Parameters.Clear();
                _dbDB2.AddInParameter(_cmd_SC_DB2, "WCOD_CURV", DbType.Int32, intCodigoCurva);
                _dbDB2.AddInParameter(_cmd_SC_DB2, "WDAT_INCU_VIGE", DbType.DateTime, dtDateInclusaoCurva);
                _dbDB2.AddInParameter(_cmd_SC_DB2, "WDAT_HORA_EXEO_CUR", DbType.DateTime, dtHoraExcucao);               
                DsRetorno = _dbDB2.ExecuteDataSet(_cmd_SC_DB2);


                if (DsRetorno.Tables.Count > 0 && DsRetorno.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in DsRetorno.Tables[0].Rows)
                    {
                        listaRetorno.Add(EntidadeFactory.getCurvaExecucaoPonto(linha));
                       // Util.Log.GravarLog("I", string.Format("{0};{1};{2}",listaRetorno[listaRetorno.Count-1].DataVencimento,listaRetorno[listaRetorno.Count-1].QuantidadeDiasCorridos,listaRetorno[listaRetorno.Count-1].QuantidadeDiasUteis)); 
                    }
                }
                //listRetorno = FillPontosCurva(DsRetorno);
            }
            catch (Exception ex)
            {
                Util.Log.GravarLog("E", "Erro para executar a busca dos pontos da curva na Proc IM07PT. Erro : " + ex.Message);                
            }
            finally
            {
                DsRetorno = null;
            }

            return listaRetorno;
        }

        public void AtualizaPontoCurva(IList<CurvaExecucaoPonto> listPontos) 
        {
            // Parâmetros :

            // IN WQTD_DURC_DIA_CRRI  DECIMAL(18,10), 
            // IN WQTD_DURC_DIA_UTIL  DECIMAL(18,10), 
            // IN WCOD_CURV           INTEGER, 
            // IN WDAT_INCU_VIGE      TIMESTAMP,
            // IN WDAT_HOR_EXEO_CURV  TIMESTAMP, 
            // IN WDAT_VCTO           DATE

           
            try
            {
                conexao.Open();
                transaction = conexao.BeginTransaction();
                
                listPontos.ToList().ForEach(ponto =>
                {

                    _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IM0SZE");
                    _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                    _cmd_SC_DB2.Parameters.Clear();
                    _dbDB2.AddInParameter(_cmd_SC_DB2, "WQTD_DURC_DIA_CRRI", DbType.Decimal, ponto.DurationDiasCorridos);
                    _dbDB2.AddInParameter(_cmd_SC_DB2, "WQTD_DURC_DIA_UTIL", DbType.Decimal, ponto.DurationDiasUteis);
                    _dbDB2.AddInParameter(_cmd_SC_DB2, "WCOD_CURV", DbType.Int32, ponto.CodigoCurva);
                    _dbDB2.AddInParameter(_cmd_SC_DB2, "WDAT_INCU_VIGE", DbType.DateTime, ponto.DataInclusaoVigencia);
                    _dbDB2.AddInParameter(_cmd_SC_DB2, "WDAT_HOR_EXEO_CURV", DbType.DateTime, ponto.DataHoraExecucaoCurva);
                    _dbDB2.AddInParameter(_cmd_SC_DB2, "WDAT_VCTO", DbType.DateTime, ponto.DataVencimento);
                    _dbDB2.ExecuteNonQuery(_cmd_SC_DB2);                  

                    //Util.Log.GravarLog("I", string.Format("{0};{1}", ponto.DurationDiasCorridos,ponto.DurationDiasUteis));               
                
                });

                transaction.Commit();

                Util.Log.GravarLog("I", string.Format("Foram atualizados {0} pontos para a Curva : {1},Data de Inclusão : {2} , Horário de Execução : {3}", listPontos.Count, listPontos[0].CodigoCurva,
                    listPontos[0].DataInclusaoVigencia.ToString("yyyy-MM-dd-hh.mm.ss.ffffff"), listPontos[0].DataHoraExecucaoCurva.ToString("yyyy-MM-dd-hh.mm.ss.ffffff")));
               
            }
            catch (Exception ex)
            {
                transaction.Rollback();

                Util.Log.GravarLog("E", "Erro para atualizar os pontos da curva . Erro : " + ex.Message);
            }
            finally
            {
                conexao.Close();
            }                 
        
        }

        public Curva ObterCurva(int curvaID)
        {
            Curva objCurva = null;
            DataSet ds;


            _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMSFI");
            _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
            _cmd_SC_DB2.Parameters.Clear();
            
            List<TaxaPontoCurvaVigente> listaTaxaPontoCurvaVigente;

            try
            {
                _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, curvaID);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@NOM_INRN_CURV", DbType.String, 15);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@NOM_CURV", DbType.String, 80);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@DES_CURV", DbType.String, 120);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_MODA_CURV", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_CATE_MERC", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_SITU", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_CURV", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_SUB_MESA_OPER", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_MESA_OPER_TES", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@QTD_ANO_EXTE", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@DAT_ULTI_ALTE", DbType.DateTime, 26);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_LIBE_AUTA", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_PMTE_VERS", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_TRCI_CURV", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_CURV_PAD", DbType.Int16, 2);
                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_CLAF_CURV", DbType.Int16, 2);

                ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2);
               
                //Verifica se é válido o retorno
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Adiciona os valores no objeto
                    objCurva = EntidadeFactory.getObterCurva(ds.Tables[0].Rows[0]);

                    //Verifica se é válido
                    if (objCurva != null)
                    {

                        _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMS10");
                        _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                        _cmd_SC_DB2.Parameters.Clear();

                        //Parametro de Entrada 
                        _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, curvaID);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@DAT_INCU_VIGE", DbType.DateTime, 26);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_MODE_CALC", DbType.Int32, 4);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_ENTR_DADO", DbType.Int16, 2);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_PRZ", DbType.Int16, 2);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_PRZ_ENTR", DbType.Int16, 2);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_MOED", DbType.Int16, 2);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_TXA", DbType.Int16, 2);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_MODE_INTV_TOLE", DbType.Int32, 4);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@DAT_INIO_CURV_VIGE", DbType.DateTime, 26);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@DAT_FIM_CURV_VIGE", DbType.DateTime, 26);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_PMRO_FATR_1", DbType.Int16, 2);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_CURV_BASE_PMT", DbType.Int32, 4);
                        _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_PMRO_LIBR_DFL", DbType.Int16, 2);

                        //Recupera a consulta
                        ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2);
                        //Limpa Lista de Parametros
                      

                        //Verifica se é válido
                        if (ds != null && ds.Tables.Count > 0
                            && ds.Tables[0].Rows.Count > 0)
                        {
                            //Adiciona os valores no objeto
                            objCurva.CurvaVigente = EntidadeFactory.getCurvaVigente(ds.Tables[0].Rows[0]);

                            //Segundo a orientação da Aleksandra, codigo Praça Calendario fixo 1
                            objCurva.CurvaVigente.CodigoPraca = 1;
                        }

                        //Verifica se é válido
                        if (objCurva.CurvaVigente != null)
                        {
                            //Parametro de Entrada 

                            _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMSEK");
                            _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                            _cmd_SC_DB2.Parameters.Clear();

                            _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, curvaID);
                            _dbDB2.AddInParameter(_cmd_SC_DB2, "@DAT_INCU_VIGE", DbType.DateTime, objCurva.CurvaVigente.DataInclusao);                          

                            //Recupera a consulta
                            ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2);

                           

                            if (ds != null && ds.Tables.Count > 0)
                            {
                                //Instância a lista
                                listaTaxaPontoCurvaVigente = new List<TaxaPontoCurvaVigente>();

                                //Percorre todos os registros da tabela
                                foreach (DataRow linha in ds.Tables[0].Rows)
                                {
                                    //Adiciona os valores no objeto
                                    listaTaxaPontoCurvaVigente.Add(EntidadeFactory.getTaxaPontoCurvaVigente(linha));
                                }

                                //Configura o retorno
                                objCurva.CurvaVigente.lstTaxaPontoCurvaVigente = listaTaxaPontoCurvaVigente;
                            }




                            _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMS41");
                            _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                            _cmd_SC_DB2.Parameters.Clear();

                            _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, curvaID);
                            _dbDB2.AddInParameter(_cmd_SC_DB2, "@DAT_INCU_VIGE", DbType.DateTime, objCurva.CurvaVigente.DataInclusao);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_CURV_SUCE", DbType.Int32, 4);
                            //Recupera a consulta
                            ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2);                           

                            //Verifica se é válido o retorno
                            if (ds != null && ds.Tables.Count > 0
                                && ds.Tables[0].Rows.Count > 0)
                            {
                                //Adiciona os valores no objeto
                                objCurva.CurvaVigente.CurvaSucessora = (EntidadeFactory.getCurvaSucessora(ds.Tables[0].Rows[0]));
                            }

                            //Verifica se é válido
                            if (objCurva.CurvaVigente.CurvaSucessora != null)
                            {
                                //Parametro de Entrada 
                                _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMSFI");
                                _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                                _cmd_SC_DB2.Parameters.Clear();

                                _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, objCurva.CurvaVigente.CurvaSucessora.CodigoCurvaSucessora);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@NOM_INRN_CURV", DbType.String, 15);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@NOM_CURV", DbType.String, 80);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@DES_CURV", DbType.String, 120);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_MODA_CURV", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_CATE_MERC", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_SITU", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_CURV", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_SUB_MESA_OPER", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_MESA_OPER_TES", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@QTD_ANO_EXTE", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@DAT_ULTI_ALTE", DbType.DateTime, 26);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_LIBE_AUTA", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_PMTE_VERS", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_TRCI_CURV", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_CURV_PAD", DbType.Int16, 2);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_CLAF_CURV", DbType.Int16, 2);

                                //Recupera a consulta
                                ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2);   

                                //Verifica se é válido o retorno
                                if (ds != null && ds.Tables.Count > 0
                                    && ds.Tables[0].Rows.Count > 0)
                                {
                                    Curva curva = EntidadeFactory.getObterCurva(ds.Tables[0].Rows[0]);
                                    CurvaSucessora curvaSucessora = new CurvaSucessora();
                                    curvaSucessora.CodigoCurva = curva.CodigoCurva;
                                    curvaSucessora.NomeCurva = curva.NomeCurva;
                                    objCurva.CurvaVigente.Curva = curvaSucessora;

                                    //Adiciona os valores no objeto
                                    // TODO remover
                                    //objCurva.CurvaVigente.Curva.CodigoCurva = Convert.ToInt32(ds.Tables[0].Rows[0]["COD_CURV"]);
                                }
                            }

                            //Carrega dados de curva composta
                            if (objCurva.CurvaVigente.CodigoTipoEntradaDado == 1)
                            {


                                _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMSIV");
                                _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                                _cmd_SC_DB2.Parameters.Clear();

                                _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, curvaID);
                                _dbDB2.AddInParameter(_cmd_SC_DB2, "@DAT_INCU_VIGE", DbType.DateTime, objCurva.CurvaVigente.DataInclusao);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@DES_FORU_CPSC", DbType.String, 100);
                                //Recupera a consulta
                                ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2);   

                                //Verifica se é válido o retorno
                                if (ds != null && ds.Tables.Count > 0
                                    && ds.Tables[0].Rows.Count > 0)
                                    //Recupera o objeto
                                    objCurva.CurvaVigente.ComposicaoCurva = EntidadeFactory.getComposicaoCurva(ds.Tables[0].Rows[0]);

                            }

                            //Parametro de Entrada 


                            _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMSEV");
                            _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                            _cmd_SC_DB2.Parameters.Clear();

                            _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, curvaID);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_EXEO_GRD", DbType.Int16, 2);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@HOR_INIO", DbType.Time, 8);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@HOR_FIM", DbType.Time, 8);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@QTD_TEMP", DbType.Int16, 2);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_UNID_TEMP", DbType.Int16, 2);
                            //Recupera a consulta
                            ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2);  
                         
                            if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                            {
                                //Adiciona os valores no objeto
                                objCurva.GradeExecucaoCurva = EntidadeFactory.getGradeExecucaoCurva(ds.Tables[0].Rows[0]);
                            }

                            //Veririfica se é válido
                            if (objCurva.GradeExecucaoCurva != null)
                            {
                                //Parametro de Entrada 
                                _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMSEW");
                                _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                                _cmd_SC_DB2.Parameters.Clear();

                                _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, curvaID);

                                //Recupera a consulta
                                ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2); 
                                //Instância a lista
                                objCurva.GradeExecucaoCurva.registroGradeExecucaoCurva = new List<RegistroGradeExecucaoCurva>();

                                if (ds.Tables.Count > 0)
                                {
                                    //Percorre todos os registros da tabela
                                    foreach (DataRow linha in ds.Tables[0].Rows)
                                    {
                                        //Recupera os itens
                                        objCurva.GradeExecucaoCurva.registroGradeExecucaoCurva.Add(EntidadeFactory.getRegistroGradeExecucaoCurva(linha));
                                    }
                                }
                            }

                            //Verifica se é válido
                            if (objCurva.CurvaVigente.ComposicaoCurva != null)
                            {

                                

                                //Parametro de Entrada 
                                _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMSIW");
                                _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                                _cmd_SC_DB2.Parameters.Clear();

                                _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, curvaID);
                                _dbDB2.AddInParameter(_cmd_SC_DB2, "@DAT_INCU_VIGE", DbType.DateTime, objCurva.CurvaVigente.DataInclusao);
                                //Recupera a consulta
                                ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2); 
                               

                                //Instância a lista
                                objCurva.CurvaVigente.ComposicaoCurva.Itens = new List<ItemComposicao>();

                                if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                                {

                                    //Percorre todos os registros da tabela
                                    foreach (DataRow linha in ds.Tables[0].Rows)
                                    {
                                        //Adiciona o item
                                        objCurva.CurvaVigente.ComposicaoCurva.Itens.Add(EntidadeFactory.getItemComposicaoCurva(linha));
                                    }
                                }
                            }

                            //Carrega dados de importacao de arquivo
                            if (objCurva.CurvaVigente.CodigoTipoEntradaDado == 3)
                            {

                                //Parametro de Entrada 
                                _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IM0SPB");
                                _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                                _cmd_SC_DB2.Parameters.Clear();

                                _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_CURV", DbType.Int32, curvaID);
                                _dbDB2.AddInParameter(_cmd_SC_DB2, "@DAT_INCU_VIGE", DbType.DateTime, objCurva.CurvaVigente.DataInclusao);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@SIG_TIPO_ARQU", DbType.String, 4);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@NOM_DRTO", DbType.String, 100);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@NOM_ARQU", DbType.String, 30);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@NOM_PNLH", DbType.String, 30);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_VLDO_DAT_RFRC", DbType.String, 1);
                                _dbDB2.AddOutParameter(_cmd_SC_DB2, "@IND_VLDO_NOM_ARQU", DbType.String, 1);

                                //Recupera a consulta
                                ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2); 

                                //Verifica se é válido o retorno
                                if (ds != null && ds.Tables.Count > 0
                                    && ds.Tables[0].Rows.Count > 0)
                                    //Recupera o objeto
                                    objCurva.CurvaVigente.ImportacaoArquivo = EntidadeFactory.getImportacaoArquivo(ds.Tables[0].Rows[0]);

                            }




                            //Parametro de Entrada 
                            _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMS08");
                            _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                            _cmd_SC_DB2.Parameters.Clear();

                            _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_MODE_INTV_TOL", DbType.Int32, objCurva.CurvaVigente.CodigoModeloIntervaloTolerancia);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_TIPO_INTV_TOL", DbType.Int16, 2);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@COD_ACAO_RETE", DbType.Int16, 2);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@NOM_MODE_INTV_TOL", DbType.String, 30);
                            _dbDB2.AddOutParameter(_cmd_SC_DB2, "@DES_MODE_INTV_TOL", DbType.String, 100);

                            //Recupera a consulta
                            ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2); 

                            
                           
                            //Verifica se é válido o retorno
                            if (ds != null && ds.Tables.Count > 0
                                && ds.Tables[0].Rows.Count > 0)
                                //Recupera o objeto
                                objCurva.CurvaVigente.ModeloIntervaloTolerancia = EntidadeFactory.getModeloIntervaloToleranciaParametro(ds.Tables[0].Rows[0]);


                            //Verifica se é válida
                            if (objCurva.CurvaVigente.ModeloIntervaloTolerancia != null)
                            {


                                //Parametro de Entrada 
                                _cmd_SC_DB2 = _dbDB2.GetSqlStringCommand("DB2IM.IMS07");
                                _cmd_SC_DB2.CommandType = CommandType.StoredProcedure;
                                _cmd_SC_DB2.Parameters.Clear();

                                _dbDB2.AddInParameter(_cmd_SC_DB2, "@COD_MODE_INTV_TOL", DbType.Int32, objCurva.CurvaVigente.CodigoModeloIntervaloTolerancia);

                                //Recupera a consulta
                                ds = _dbDB2.ExecuteDataSet(_cmd_SC_DB2); 

                                //Instância a lista de saída
                                objCurva.CurvaVigente.ModeloIntervaloTolerancia.lstParametroModeloIntervaloTolerancia = new List<ParametroModeloIntervaloTolerancia>();

                                //Percorre todos os registros da tabela
                                foreach (DataRow linha in ds.Tables[0].Rows)
                                {
                                    //Adiciona o item
                                    objCurva.CurvaVigente.ModeloIntervaloTolerancia.lstParametroModeloIntervaloTolerancia.Add(EntidadeFactory.getParametroModeloIntervaloTolerancia(linha));

                                }
                            }
                        }

                        //Retorna a consulta
                        return objCurva;
                    }
                }

            }
            catch (Exception ex)
            {
                Util.Log.GravarLog("E", "Erro para buscar dados da curva. Erro : " + ex.Message);
            }

            finally
            {
                //Desaloca o objeto
                objCurva = null;                
                ds = null;
                listaTaxaPontoCurvaVigente = null;
            }

            return new Curva();
        }


        #region Fill Curva

        public static Entity.Curva FillCurva(DataRow linha)
        {
            Entity.Curva curva = new Entity.Curva();

            try
            {

                curva.codCurva = Convert.ToInt32(linha["COD_CURV"].ToString());
                curva.dtInclusao = Convert.ToDateTime(linha["DAT_INCU_VIGE"].ToString());
                curva.dtExecucao = Convert.ToDateTime(linha["DAT_INCU_VIGE"].ToString());               
            }
            catch (Exception ex)
            {
                Util.Log.GravarLog("E", "Erro para popular o objeto Curva. Erro : " + ex.Message);
            }

            return curva;
        }

        public static List<Entity.Curva> FillCurvas(DataSet dsRetornoCurva)
        {
            List<Entity.Curva> listCurvas = new List<Entity.Curva>();

            foreach (DataRow row in dsRetornoCurva.Tables[0].Rows)
            {
                listCurvas.Add(FillCurva(row));
            }

            return listCurvas;
        }

        #endregion

        #region Fill Ponto da Curva

        public static Entity.PontoCurva FillPonto(DataRow linha) 
        {
            Entity.PontoCurva pontoCurva = new Entity.PontoCurva();

            try
            {               

                pontoCurva.codCurva = Convert.ToInt32(linha["COD_CURV"].ToString());
                pontoCurva.qdtDiasCorridos = Convert.ToInt32(linha["QTD_DIA_CRRI"].ToString());
                pontoCurva.qtdDiasUteis = Convert.ToInt32(linha["QTD_DIA_UTIL"].ToString());
                pontoCurva.vlrValorPonto = Convert.ToDecimal(linha["VLR_PONT"].ToString());
                pontoCurva.dtInclusao = Convert.ToDateTime(linha["DAT_INCU_VIGE"].ToString());
                pontoCurva.dtHoraExec = Convert.ToDateTime(linha["DAT_HOR_EXEO_CURV"].ToString());
                pontoCurva.dtVcto = Convert.ToDateTime(linha["DAT_VCTO"].ToString());
            }
            catch (Exception ex)
            {
                Util.Log.GravarLog("E", "Erro para popular o objeto PontoCurva. Erro : " + ex.Message); 
            }            

            return pontoCurva;
        }

        public static List<Entity.PontoCurva> FillPontosCurva(DataSet dsRetornoCurva) 
        {
            List<Entity.PontoCurva> listPontoCurvas = new List<Entity.PontoCurva>();

            foreach( DataRow row in dsRetornoCurva.Tables[0].Rows)
            {
                listPontoCurvas.Add(FillPonto(row));
            }

            return listPontoCurvas;
        }

        #endregion

        #endregion        

        #region IDisposable Members

        public void Dispose()
        {
           
            GC.SuppressFinalize(this);
        }

        #endregion

        #endregion
    }
}

